#include "../source/server.hpp"

// #define LOG(msg) fprintf(stdout, "[%s:%d]%s", __FILE__, __LINE__, msg)
// #define LOG(format, ...) fprintf(stdout, "[%s:%d] " format, __FILE__, __LINE__, __VA_ARGS__)

//...是至少要传一个参数，如果不想传参数，就需要加上##
// #define LOG(format, ...) fprintf(stdout, "[%s:%d] " format "\n", __FILE__, __LINE__, ## __VA_ARGS__)

//宏要求都要在一行上，\转义换行，表示后面都没有换行了
//do{}while(0)如同()括号的作用一样
#define INF 0
#define DBG 1
#define ERR 2
#define LOG_LEVEL DBG
#define LOG(level, format, ...) do{\
    if (level < LOG_LEVEL) break;\
    time_t t = time(NULL);\
    struct tm* ltm = localtime(&t);\
    char tmp[32] = {0};\
    strftime(tmp, 31, "%H:%M:%S", ltm);\
    fprintf(stdout, "[%s %s:%d] " format "\n", tmp, __FILE__, __LINE__, ## __VA_ARGS__);\
}while(0)
#define INF_LOG(format, ...) LOG(INF, format, ## __VA_ARGS__)//使用不定参的时候不能用...只能声明定义的时候用，使用的时候用__VA_ARGS__
#define DBG_LOG(format, ...) LOG(DBG, format, ## __VA_ARGS__)
#define ERR_LOG(format, ...) LOG(ERR, format, ## __VA_ARGS__)

int main()
{
    Buffer buf;
    for (int i = 0; i < 300; i++)
    {
        std::string str = "hello!!" + std::to_string(i) + '\n';
        buf.WriteStringAndPush(str);
    }
    while (buf.ReadAbleSize() > 0)//如果取不出来，就永远不会为0
    {
        std::string line = buf.GetLineAndPop();
        DBG_LOG("%s", line.c_str());
    }


    return 0;
}